home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 7
/
Apprentice-Release7.iso
/
Source Code
/
Pascal
/
Snippets
/
PNL Libraries
/
MyAEProperties.p
< prev
next >
Wrap
Text File
|
1996-05-29
|
7KB
|
218 lines
procedure InitAEUtils;
{ function GetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc): OSErr;}
{ function SetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc): OSErr;}
function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
function ValidProperty (class, prop: DescType): boolean;
function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
var
GetPropertyFromContainerProc: ProcPtr;
SetPropertyFromContainerProc: ProcPtr;
{$S Init}
procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
begin
GetPropertyFromContainerProc := GetPropertyFromContainer;
SetPropertyFromContainerProc := SetPropertyFromContainer;
end;
{$S}
function CallGetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc; p: Ptr): OSErr;
inline
$205F, $4E90;
function CallSetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc; p: Ptr): OSErr;
inline
$205F, $4E90;
function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
var
h: Handle;
err: OSErr;
begin
h := nil;
err := PtrToHand(@prop, h, SizeOf(DescType));
if err = noErr then
err := PtrAndHand(@container.descriptorType, h, SizeOf(DescType));
if err = noErr then
err := HandAndHand(container.dataHandle, h);
if err = noErr then begin
HLock(h);
err := AECreateDesc(typeMyPropertyToken, h^, GetHandleSize(h), token);
end;
DisposeHandle(h);
StorePropertyReferenceInToken := err;
end;
function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
var
conttype: DescType;
err: OSErr;
begin
BlockMove(token.dataHandle^, @prop, SizeOf(DescType));
BlockMove(Ptr(ord(token.dataHandle^) + SizeOf(DescType)), @conttype, SizeOf(DescType));
HLock(token.dataHandle);
err := AECreateDesc(conttype, Ptr(ord(token.dataHandle^) + 2 * SizeOf(DescType)), GetHandleSize(token.dataHandle) - 2 * SizeOf(DescType), container);
HUnlock(token.dataHandle);
if err <> noErr then begin
AECreate(container);
end;
RetrievePropertyReferenceFromToken := err;
end;
type
propertiesRecord = record
count: integer;
props: array[1..1000] of DescType;
end;
propertiesRecordPtr = ^propertiesRecord;
propertiesRecordHandle = ^propertiesRecordPtr;
function OSTypeToString (ost: OSType): Str15;
var
s: Str15;
begin
s[0] := chr(4);
BlockMove(@ost, @s[1], 4);
OSTypeToString := s;
end;
function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
var
h: propertiesRecordHandle;
begin
h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
GetIndProperty := false;
if h <> nil then begin
if (0 < index) & (index <= h^^.count) then begin
prop := h^^.props[index];
GetIndProperty := true;
end;
HPurge(Handle(h));
end;
end;
function ValidProperty (class, prop: DescType): boolean;
var
h: propertiesRecordHandle;
i: integer;
begin
h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
ValidProperty := false;
if h <> nil then begin
for i := 1 to h^^.count do begin
if h^^.props[i] = prop then begin
ValidProperty := true;
leave;
end;
end;
HPurge(Handle(h));
end;
end;
function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
var
err: OSErr;
prop: DescType;
begin
if keyForm = formPropertyID then begin
err := GetTypeFromAEDesc(keyData, prop);
if err = noErr then begin
if ValidProperty(containerToken.descriptorType, prop) then begin
err := StorePropertyReferenceInToken(prop, containerToken, token);
end
else begin
err := errAENoSuchObject;
end;
end;
end
else begin
err := errAEBadKeyForm;
end;
MyOAFindProperty := err;
end;
function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
var
err, junk: OSErr;
prop: DescType;
container: AEDesc;
begin
err := RetrievePropertyReferenceFromToken(token, prop, container);
if err = noErr then begin
err := CallSetPropertyFromContainer(prop, container, value, SetPropertyFromContainerProc);
end;
AEDestroy(container);
SetPropertyFromToken := err;
end;
function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
var
index: integer;
prop: DescType;
element: AEDesc;
err, junk: OSErr;
begin
index := 1;
while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
err := AEGetKeyDesc(value, prop, typeWildCard, element);
if err = noErr then begin
err := CallSetPropertyFromContainer(prop, token, element, SetPropertyFromContainerProc);
AEDestroy(element);
end
else if err = errAEDescNotFound then begin
err := noErr;
end;
index := index + 1;
end;
SetPropertyRecord := err;
end;
function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
var
err, junk: OSErr;
prop: DescType;
container: AEDesc;
begin
err := RetrievePropertyReferenceFromToken(token, prop, container);
if err = noErr then begin
err := CallGetPropertyFromContainer(prop, container, result, GetPropertyFromContainerProc);
end;
AEDestroy(container);
GetPropertyFromToken := err;
end;
function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
var
index: integer;
prop: DescType;
element: AEDesc;
err, junk: OSErr;
begin
err := AECreateList(nil, 0, true, result);
index := 1;
while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
err := CallGetPropertyFromContainer(prop, token, element, GetPropertyFromContainerProc);
if err = noErr then begin
err := AEPutKeyDesc(result, prop, element);
AEDestroy(element);
end
else if err = errAEReadDenied then begin
err := noErr;
end;
index := index + 1;
end;
if err <> noErr then begin
AEDestroy(result);
end;
GetPropertyRecord := err;
end;